home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
ms_dos
/
thbfc
/
thpo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-30
|
4KB
|
219 lines
/*
THpo下級印字UTY
By 五味(93/04/21~93/04/22)
*/
#include <stdio.h>
#include <stdlib.h>
#include <jctype.h>
#define TRUE 1
#define FALSE 0
#define BUFMAX 4096
int f=TRUE; /* 行のフラッシュフラグ */
int isANK=TRUE; /* ANKモードか否か */
char tbuf[BUFMAX]; /* テンポラリバッファ */
int PRN_put(char);
char keyin(void);
void waiter(void)
{
char k;
while( (k=keyin())==0 );
if( k==0x1b ){
printf(" 中断しました.\n");
exit(0);
}
}
void PRN_putc(char c)
{
int i;
while( (i=PRN_put(c)) ){
switch(i){
case 2:
case 3:
printf(" error: プログラミングエラー.\n");
exit(2);
case 4:
printf(" 用紙切れです.\n");
waiter();
break;
case 5:
printf(" オフラインです.\n");
waiter();
break;
case 0x80:
printf(" fatal: プリンタの動作エラーです.");
exit(2);
default:
printf(" BIOSエラー.\n");
exit(2);
}
}
}
void PRN_flash(void) /* 行印字のフラッシュ */
{
if( f==FALSE ) {
PRN_putc(0x0a);
PRN_putc(0x0d); /* 吐き出し */
}
f=TRUE;
}
void PRN_ank(void)
{
PRN_putc(0x1b);
PRN_putc('(');
PRN_putc('H');
isANK=TRUE;
}
void PRN_kan(void)
{
PRN_putc(0x1b);
PRN_putc('$');
PRN_putc('B');
isANK=FALSE;
}
void PRN_puts(char *str)
{
unsigned short c;
unsigned char *p;
for(p=(unsigned char *)str;*p!=0;){
if( iskanji(*p) ) {
if( isANK ) PRN_kan();
c=jmstojis((*p<<8)+(*(p+1))); p+=2;
PRN_putc(c >> 8);
PRN_putc(c&0xff);
}else{
if( !isANK )PRN_ank();
PRN_putc(*(p++));
}
}
}
void settab(int p)
{
int t;
if( p>=10000 ){ PRN_putc(0x20+(t=p/10000));p-=t*10000; }
if( p>=1000 ){ PRN_putc(0x20+(t=p/1000 ));p-=t*1000; }
if( p>=100 ){ PRN_putc(0x20+(t=p/100 ));p-=t*100; }
if( p>=10 ){ PRN_putc(0x20+(t=p/10 ));p-=t*10; }
PRN_putc(0x60+(p ));
}
void PRN_init(void)
{
int i,p,t;
PRN_ank();
PRN_putc(0x1c);
PRN_putc('#');
for( i=0 ; i<32-1 ; i++ )settab(i*24*4);
p=31*24*4;
if( p>=10000 ){ PRN_putc(0x20+(t=p/10000));p-=t*10000; }
if( p>=1000 ){ PRN_putc(0x20+(t=p/1000 ));p-=t*1000; }
if( p>=100 ){ PRN_putc(0x20+(t=p/100 ));p-=t*100; }
if( p>=10 ){ PRN_putc(0x20+(t=p/10 ));p-=t*10; }
PRN_putc(0x70+(p ));
PRN_putc(0x1c);
PRN_putc('$');
PRN_putc(0x22);
PRN_putc(0x74);
}
void illopt(char *opt) /* 違法なオプション */
{
printf(" illegal option '%s'.",opt);
exit(1);
}
void fileprn(char *path) /* ファイル印字 */
{
FILE *fp;
PRN_flash();
if( (fp=fopen(path,"r"))==0 ) {
printf(" '%s' not found.\n",path);
exit(1);
}
while( fgets(tbuf,BUFMAX,fp) ) {
PRN_puts(tbuf);
}
if( ferror(fp) ) {
printf(" read error.\n",path);
exit(2);
}
}
int main(int argc,char *argv[])
{
int i;
if( argc==1 ) {
printf( " \'THpo\' print uty v1.1\n"
" (c) H.Gomi 93/04/22\n"
" [usage] THpo [-fFILENAME][-+o]<line>\n" );
return 0;
}
PRN_init();
for( i=1 ; i<argc ; i++ ) {
if( *argv[i]=='+' )
switch(*(argv[i]+1)) {
case'o':
PRN_putc(0x1c);
PRN_putc('T');
break; /* 欧文処理開始 */
case'f':
fileprn(argv[i]+2);
break; /* ファイル印字 */
default:
illopt(argv[i]);
}
else if( *argv[i]=='-' )
switch(*(argv[i]+1)) {
case'o':
PRN_putc(0x1c);
PRN_putc('U');
break; /* 欧文処理終了 */
case'f':
fileprn(argv[i]+2);
break; /* ファイル印字 */
default:
illopt(argv[i]);
}
else{
f=FALSE;
PRN_puts(argv[i]); /* 印字 */
PRN_ank();
PRN_putc(0x20);
if( isANK==FALSE )
PRN_kan();
}
}
PRN_flash();
return 0;
}